package com.rose.redis._data_structure.string;

import com.rose.redis._data_structure.hash.People;
import com.rose.redis.util.JacksonUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.data.redis.core.StringRedisTemplate;

import java.util.concurrent.TimeUnit;

/**
 * <p>
 * Redis的String
 * 一：动态字符串 SDS，类似于Java的ArrayList，内部维护了一个字节数组。
 *
 * 二：语法：
 * 语法：set key value
 * e.g set name zhangsan
 * ==> 1
 *
 * 语法：get key
 * e.g：get name
 * ==> zhangsan
 *
 * 总结：可以使用String存储对象，存储方式如下。
 *
 * 三：常用命令
 * 1：set [key] [value]：给指定key设置值(set可覆盖老的值)。
 * 2：get [key]：获取指定key 的值
 * 3：del [key]：删除指定key。
 * 4：exists [key]：判断是否存在指定key。
 * 5：mset [key1] [value1] [key2] [value2] ......：批量存键值对。
 * 6：mget [key1] [key2] ......：批量取key。
 * 7：expire [key] [time]：给指定key 设置过期时间，单位秒。
 * 8：setex [key] [time] [value]：等价于 set + expire 命令组合。
 * 9：setnx [key] [value]：如果key不存在则set 创建，否则返回0。
 * 10：incr [key]：如果value为整数 可用 incr命令每次自增1。
 * 11：incrby [key] [number]：使用incrby命令对整数值 进行增加 number。
 *
 * </p>
 *
 * @author: zhu.chen
 * @date: 2021/1/5
 * @version: v1.0.0
 */
//@Component
public class TestStringCommandLineRunner implements CommandLineRunner {

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @Override
    public void run(String... args) throws Exception {
        People people = new People("xiaoming", 20);
        stringRedisTemplate.opsForValue().set(people.getName(), JacksonUtil.serialize(people));
    }

    void test1() throws InterruptedException {
        stringRedisTemplate.opsForValue().set("username", "zhangsan", 20, TimeUnit.SECONDS);
        System.out.println(stringRedisTemplate.opsForValue().get("username"));

        for (int i = 0; i < 10; i++) {
            TimeUnit.SECONDS.sleep(5);
            stringRedisTemplate.opsForValue().increment("name");
        }
    }

}
